package fiscal.dao;

import java.util.ArrayList;

import javax.persistence.Query;

import mercadologico.entities.tables.GrupoGenericoProduto;

import exceptions.PersistenceExceptionMessage;
import fiscal.entities.tables.Classificacao;
import fiscal.entities.tables.MoldeProduto;
import generic.dao.GenericDAO;

public class PersistenceMoldeProduto extends GenericDAO<MoldeProduto, Integer>{

	@Override
	public Class<MoldeProduto> getCurrentClass() {
		return MoldeProduto.class;
	}

	@SuppressWarnings("unchecked")
	public ArrayList<MoldeProduto> findByDescricaoLike(String descricao) throws PersistenceExceptionMessage {
		if (getEntityManager() != null) {
			Query query = getEntityManager().createQuery("FROM " +getCurrentClass().getName() +" c WHERE " +
					" c.descricao LIKE :descricao ORDER BY c.descricao");
		
			query.setParameter("descricao", descricao +"%");
		
			return (ArrayList<MoldeProduto>) query.getResultList();
		}
		return new ArrayList<MoldeProduto>();
	}

	@SuppressWarnings("unchecked")
	public ArrayList<MoldeProduto> findByDescricaoAndParametros(
			String descricao, boolean fracionada, boolean importado,
			boolean cotacao, boolean produtoSimilar) throws PersistenceExceptionMessage {
		if (getEntityManager() != null) {
			Query query = getEntityManager().createQuery("FROM " +getCurrentClass().getName() +" c WHERE " +
					" c.descricao LIKE :descricao AND c.fracionada = :fracionada AND c.importado = :importado AND " +
					" c.cotacao = :cotacao AND c.produtoSimilar = :produtoSimilar ORDER BY c.descricao");
		
			query.setParameter("descricao", descricao +"%");
			query.setParameter("fracionada", fracionada);
			query.setParameter("importado", importado);
			query.setParameter("cotacao", cotacao);
			query.setParameter("produtoSimilar", produtoSimilar);
		
			return (ArrayList<MoldeProduto>) query.getResultList();
		}
		return new ArrayList<MoldeProduto>();
	}

	@SuppressWarnings("unchecked")
	public ArrayList<MoldeProduto> findByDescricaoAndParametrosAndClassificao(
			String descricao, boolean fracionada, boolean importado,
			boolean cotacao, boolean produtoSimilar, Classificacao classificacao) throws PersistenceExceptionMessage {
		
		if (getEntityManager() != null) {
			Query query = getEntityManager().createQuery("FROM " +getCurrentClass().getName() +" c WHERE " +
					" c.descricao LIKE :descricao AND c.fracionada = :fracionada AND c.importado = :importado AND " +
					" c.cotacao = :cotacao AND c.produtoSimilar = :produtoSimilar AND c.classificacao = :classificacao " +
					" ORDER BY c.descricao");
		
			query.setParameter("descricao", descricao +"%");
			query.setParameter("fracionada", fracionada);
			query.setParameter("importado", importado);
			query.setParameter("cotacao", cotacao);
			query.setParameter("produtoSimilar", produtoSimilar);
			query.setParameter("classificacao", classificacao);
		
			return (ArrayList<MoldeProduto>) query.getResultList();
		}
		return new ArrayList<MoldeProduto>();
	}

	@SuppressWarnings("unchecked")
	public ArrayList<MoldeProduto> findByDescricaoLikeAndClassificacao(
			String descricao, Classificacao classificacao) throws PersistenceExceptionMessage {
		if (getEntityManager() != null) {
			Query query = getEntityManager().createQuery("FROM " +getCurrentClass().getName() +" c WHERE " +
					" c.descricao LIKE :descricao AND c.classificacao = :classificacao ORDER BY c.descricao");
		
			query.setParameter("descricao", descricao +"%");
			query.setParameter("classificacao", classificacao);
		
			return (ArrayList<MoldeProduto>) query.getResultList();
		}
		return new ArrayList<MoldeProduto>();
	}

	@SuppressWarnings("unchecked")
	public ArrayList<MoldeProduto> findMoldeProdutoByGrupoGenericoProduto(
			GrupoGenericoProduto grupoProdutoGenerico) throws PersistenceExceptionMessage {
		if (getEntityManager() != null) {
			Query query = getEntityManager().createQuery("FROM " +getCurrentClass().getName() +" c WHERE " +
					" c.grupoProdutoGenerico = :grupoProdutoGenerico ORDER BY c.descricao");
		
			query.setParameter("grupoProdutoGenerico", grupoProdutoGenerico);
			return (ArrayList<MoldeProduto>) query.getResultList();
		}
		return new ArrayList<MoldeProduto>();
	}

	@SuppressWarnings("unchecked")
	public ArrayList<MoldeProduto> findMoldeProdutoByGrupoGenericoProdutoAndLikeDescricao(
			GrupoGenericoProduto grupoProdutoGenerico, String descricao) throws PersistenceExceptionMessage {
		if (getEntityManager() != null) {
			Query query = getEntityManager().createQuery("FROM " +getCurrentClass().getName() +" c WHERE " +
					" c.grupoProdutoGenerico = :grupoProdutoGenerico AND c.descricao LIKE :descricao ORDER BY c.descricao");
	
			query.setParameter("grupoProdutoGenerico", grupoProdutoGenerico);
			query.setParameter("descricao", descricao +"%");
			return (ArrayList<MoldeProduto>) query.getResultList();
		}
		return new ArrayList<MoldeProduto>();
	}

}
